#include "impls.h"


cv::Mat my_resize(const cv::Mat& input, float scale) {
    /**
     * 要求：
     *      实现resize算法，只能使用基础的语法，比如说for循环，Mat的基本操作。不能
     * 用cv::resize。resize算法的内容自行查找学习，不是很难。
     * 
     * 提示：
     * 无。
     * 
     * 通过条件：
     * 运行测试点，你的结果跟答案长的差不多就行。
     */
    
    // IMPLEMENT YOUR CODE HERE
   
    
   
    int new_rows = static_cast<int>(input.rows * scale);
    int new_cols = static_cast<int>(input.cols * scale);
    cv::Mat output = cv::Mat::zeros(new_rows, new_cols, input.type());

    for (int i = 0; i < new_rows; ++i) {
        for (int j = 0; j < new_cols; ++j) {
            float x = i / scale;
            float y = j / scale;
            int x1 = static_cast<int>(x);
            int y1 = static_cast<int>(y);
            int x2 = std::min(x1 + 1, input.rows - 1);
            int y2 = std::min(y1 + 1, input.cols - 1);
            float dx = x - x1;
            float dy = y - y1;

            cv::Vec3b pixel1 = input.at<cv::Vec3b>(x1, y1);
            cv::Vec3b pixel2 = input.at<cv::Vec3b>(x1, y2);
            cv::Vec3b pixel3 = input.at<cv::Vec3b>(x2, y1);
            cv::Vec3b pixel4 = input.at<cv::Vec3b>(x2, y2);

            cv::Vec3b pixel = (1 - dx) * (1 - dy) * pixel1
                            + (1 - dx) * dy * pixel2
                            + dx * (1 - dy) * pixel3
                            + dx * dy * pixel4;

            output.at<cv::Vec3b>(i, j) = pixel;
        }
    }

    return output ;
}